package com.lry.basic.aop.cglib.classs;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class UserServiceInterceptor implements MethodInterceptor {
    Object target;
    public UserServiceInterceptor(UserService userService) {
        this.target = userService;
    }

    /**
     *
     * @param proxy 代理对象
     * @param method 目标方法
     * @param args 目标方法参数
     * @param methodProxy 代理方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

        boolean exception = false;
        try{
            System.out.println(target.getClass()+"."+method.getName()+"开启事务");
            //return methodProxy.invokeSuper(proxy,args);
            return method.invoke(target,args); //事务一调用事务2，事务二增强会失效, 因为对象是原生对象，不是cglib增强对象
        }catch (Exception e){
            exception = true;
            System.out.println(target.getClass()+"."+method.getName()+"回滚事务");
        }finally {
            if(!exception)
                System.out.println(target.getClass()+"."+method.getName()+"提交事务");
        }
        return null;

    }
//methodProxy.invokeSuper(proxy,args);
//    final int CGLIB$select$0() {
//        return super.select();//直接调用父类即UserMapper的select方法
//    }

//methodProxy.invoke(proxy,args);这样写会死循环
//    final int select() {
//        var10000.intercept()
//    }
}
